package sde.actor.csm;
import java.util.*;
import java.io.*;
import sde.actor.*;

public class OsservatoreStazione implements Osservatore{

	//tempi di arrivo clienti in coda
	private LinkedList<Double> arrivi=new LinkedList<Double>();

        
	protected double totaleTempiServizi=0, 
	                 totaleTempiRisposta=0, 
	                 totaleTempiAttesa=0,
	                 tempoInizioServizio=0;
	protected int numeroServizi=0;
	protected String nomeFile;
	protected double tEnd;
	protected Traiettoria presenze /*N*/;   
	
	protected class Traiettoria{
		private double grandezza=0, area=0, t=0;
		public void inizializza(){
			grandezza=0; area=0; t=0;
		}//inizializza
		public void aggiornamento( double grandezza, double t  ){
			area = area+this.grandezza*(t-this.t);
			this.grandezza = grandezza;
			this.t = t;
		}//aggiornamento
		public double mediaTemporale(){
			area = area+this.grandezza*(tEnd-this.t);
			return area/tEnd;
		}//mediaTemporale
	}//Traiettoria

	public OsservatoreStazione( double tEnd, String nomeFile ){
		this.tEnd = tEnd;
		this.nomeFile=nomeFile;
		presenze = new Traiettoria();
	}

	public void arrivo( Cliente c ){
		arrivi.addLast( c.getTimestamp() );
		presenze.aggiornamento( arrivi.size(), c.getTimestamp() );
	}//arrivo

	public void partenza( Cliente c ){
		double at=c.getTimestamp();
		double tempoRisposta = at - arrivi.removeFirst();
		totaleTempiRisposta += tempoRisposta;
	    presenze.aggiornamento( arrivi.size(), at );
		numeroServizi++;
		totaleTempiServizi += ( at - tempoInizioServizio );
	}//partenza

	public void uscitaCoda( Cliente c ){
		double attesaInCoda = c.getTimestamp() - arrivi.getFirst();
		totaleTempiAttesa += attesaInCoda;
	}//uscitaCoda

	public void reset(){
		arrivi.clear();
		presenze.inizializza();
	}//reset

	public void salva() throws IOException{
		PrintWriter pw = new PrintWriter( new FileWriter(nomeFile) );
		pw.println(String.format("%10s%10s%10s%10s%10s%10s%10s", "N[T]", "X[T]", "tR[T]", "U[T]", "tH[T]", "W[T]", "tMS"));
		pw.println( String.format("%10.2f", presenze.mediaTemporale()) ) ;
		pw.println( String.format("%10d",numeroServizi) );
		pw.println( String.format("%10.2f", (totaleTempiRisposta/numeroServizi)) );
		pw.println( String.format("%10.2f", totaleTempiServizi/tEnd) );
		pw.println( String.format("%10.2f", (numeroServizi/tEnd)) );
		pw.println( String.format("%10.2f", totaleTempiAttesa/numeroServizi) );
		pw.println( String.format("%10.2f", (totaleTempiServizi/numeroServizi)) );
		pw.close();
	}//salva

}//OsservatoreStazione

